//全局变量
window.clickFlag = 0
window.pullBottomTips =
	'<div class="mui-pull-bottom-tips"><div class="mui-pull-bottom-wrapper"><span class="mui-pull-loading">上拉显示更多</span></div></div>'

//取消浏览器的所有事件，使得active的样式在手机上正常生效
document.addEventListener('touchstart', function() {
	return false;
}, true);

// 禁止选择
document.oncontextmenu = function() {
	return true;
};
function $getNowFormatDate() {
	var date = new Date();
	var seperator1 = "-";
	var seperator2 = ":";
	var month = date.getMonth() + 1;
	var strDate = date.getDate();
	var hour = date.getHours();
	var minute = date.getMinutes();
	if (month >= 1 && month <= 9) {
		month = "0" + month;
	}
	if (strDate >= 0 && strDate <= 9) {
		strDate = "0" + strDate;
	}
	if (hour >= 0 && hour <= 9) {
		hour = "0" + hour;
	}
	if (minute >= 0 && minute <= 9) {
		minute = "0" + minute;
	}
	var currentdate = date.getFullYear() + seperator1 + month + seperator1 + strDate
		+ " " + hour + seperator2 + minute
		+ seperator2 + date.getSeconds();
	return currentdate;
}
function $isPC () {
    var userAgentInfo = navigator.userAgent;
    var Agents = ["Android", "iPhone",
        "SymbianOS", "Windows Phone",
        "iPad", "iPod"];
    var flag = true;
    for (var v = 0; v < Agents.length; v++) {
        if (userAgentInfo.indexOf(Agents[v]) > 0) {
            flag = false;
            break;
        }
    }
    return flag;
}

/**
 * 获取Img元素的base64
 * @param {Object} img
 */
function $getBase64Image(img) {
	var canvas = document.createElement("canvas");
	canvas.width = img.width;
	canvas.height = img.height;
	var ctx = canvas.getContext("2d");
	ctx.drawImage(img, 0, 0, img.width, img.height);
	var dataURL = canvas.toDataURL("image/png");
	return dataURL;
	//return dataURL.replace("data:image/png;base64,", ""); 
}
/**
 * 获取自定义时间  格式: 2021-10-09 星期六 09:23
 */
function $getCustomDateTime() {
	var today = new Date();
	var year = today.getFullYear();

	var month = today.getMonth() + 1;
	if (month < 10) month = '0' + month;

	var day = today.getDate();
	if (day < 10) day = '0' + day;


	var week = {
		"0": "\u65e5",
		"1": "\u4e00",
		"2": "\u4e8c",
		"3": "\u4e09",
		"4": "\u56db",
		"5": "\u4e94",
		"6": "\u516d"
	}

	var hours = today.getHours();
	if (hours < 10) hours = '0' + hours;
	var minutes = today.getMinutes();
	if (minutes < 10) minutes = '0' + minutes;
	var seconds = today.getSeconds();
	if (seconds < 10) seconds = '0' + seconds;

	var dateTime = year + "-" + month + "-" + day + "  " + "星期" + week[today.getDay()] + " " + hours +
		":" + minutes;
	return dateTime
}

/**
 *  获取当前时间:格式:yyyy-MM-dd  hh:mm:ss
 *  @type {String} 默认time 不带秒; all带秒 ; date年月日
 */
function $getCurDateTime(type) {
	var today = new Date();
	var year = today.getFullYear();
	if (type == "y") { //年
		return year;
	}
	var month = today.getMonth() + 1;
	if (month < 10) month = '0' + month;
	if (type == "m") { //月
		return month;
	}
	var day = today.getDate();
	if (day < 10) day = '0' + day;
	if (type == "m") { //日
		return day;
	}
	//日期
	if (type == "date") {
		return year + "-" + month + "-" + day;
	}
	var hours = today.getHours();
	if (hours < 10) hours = '0' + hours;
	var minutes = today.getMinutes();
	if (minutes < 10) minutes = '0' + minutes;
	var seconds = today.getSeconds();
	if (seconds < 10) seconds = '0' + seconds;
	if (type == "all") {
		return year + "-" + month + "-" + day + " " + hours + ":" + minutes + ":" + seconds;
	}
	return year + "-" + month + "-" + day + " " + hours + ":" + minutes;;
}


/**
 * 防止过快点击
 * @param {Object} fn 回调函数
 */
function $fastClick(fn) {
	if (window.clickFlag == 0) {
		window.clickFlag = 1;
		if (fn) fn()
		//1秒过后可以点击
		setTimeout(function() {
			window.clickFlag = 0
		}, 500);
	}
}
/**
 * 初始Plus
 */
function $initPlus(fn, bgcolor) {
	mui.init()
	mui.plusReady(function() {
		//header状态栏
		plus.screen.lockOrientation("portrait-primary")
		plus.navigator.setStatusBarBackground('#75AC47');
		plus.navigator.setStatusBarStyle('dark');
		var web = plus.webview.currentWebview()
		fn(web) //回调
	})
}

/**
 * 关闭窗口
 * @param {Object} id 当前webview
 * @param {Object} extras 参数
 */
function $backWindow(id, extras) {
	var old_back = mui.back;
	mui.back = function() {
		// ID一定要设置正确 不然会没用 默认的标识ID是:'HBuilder'
		var detailPage = plus.webview.getWebviewById(id);
		//固定backEvent名称
		mui.fire(detailPage, 'backEvent', extras);
		//关闭；
		old_back();
	}
}

/**
 * 打开新窗口
 * @param {Object} ele 当前元素
 * @param {Object} attr 绑定HTML上的data属性
 * @param {Object} extras 参数，处理页面间传值
 */
function $openWindow(ele, attr, extras) {
	var url
	if ($endWith(attr, ".html")) {
		url = attr; //指定结尾
	} else {
		url = ele.getAttribute(attr);
	}
	$log(url)
	if (!url) return
	//需要导入MUI
	// mui.openWindow({
	// 	url:url,
	// 	id: url,
	// 	extras:extras,
	// 	waiting: false
	// });
	mui.plusReady(function() {
		var webview = plus.webview.create(url, url, {
			background: '#75AC47',
			statusbar: {
				background: '#75AC47'
			}
			// titleNView: {
			// 	backgroundColor: '#75AC47',
			// 	titleText: extras.title,
			// 	titleColor: '#fff',
			// 	autoBackButton: true,
			// }
		}, extras);
		webview.show();
	})

}
/**
 * 是否以指定字符串结尾
 * @param {Object} str 字符串
 * @param {Object} target  指定字符串
 */
function $endWith(str, target) {
	var start = str.length - target.length;
	var arr = str.substr(start, target.length);
	if (arr == target) {
		return true;
	}
	return false;
}

/**
 * 设置某个标签文本内容
 * @param {Object} selector 支持#id .class tag  tag.class tag[属性]
 * @param {Object} text 文本内容
 */
function $setText(selector, text) {
	var ele = $query(selector)
	if (!ele) { //Id查找
		ele = $query("#" + selector)
	}
	if (ele && text) {
		ele.innerText = text
	}
	return this
}
function $setTextAll(selector, text) {
	var doms = $all(selector)
	if (doms.length) {
		for (var i = 0, len = doms.length; i < len; i++) {
			doms[i].innerText = text;
		}
	} else {
		doms.innerText = text;
	}
	return this
}

/**
 * 通过json数组 给HTML{{name}}格式赋值
 * @param {Object} json array数组
 * @param {Object} item  element
 * @param {Object} fn  item点击回调
 */
function $listData(json, item) {
	var html = ""
	json.forEach(function(value, key) {
		var str = item.innerHTML
		Object.keys(value).forEach(function(v, k) {
			var oReg = new RegExp("{{" + v + "}}", "g");
			str = str.replace(oReg, value[v])
		})
		html += str;
	})
	return html;
}
/**
 * 填充列表数据,并设置点击事件
 * @param {Object} json
 * @param {Object} item
 * @param {Object} parant
 * @param {Object} fn 回调函数
 */
function $listDataClick(json, item, parant, fn) {
	var item = $id(item) //如删除item 需要传元素
	var html = ""
	json.forEach(function(value, key) {
		//添加click
		$log(item)
		if (item && item.children) {
			item.children[0].setAttribute('click', key);
		}
		var str = item.innerHTML
		Object.keys(value).forEach(function(v, k) {
			var oReg = new RegExp("{{" + v + "}}", "g");
			str = str.replace(oReg, value[v])
		})
		html += str;
	})
	$id(parant).innerHTML = html
	//默认用div
	$clickAll('div[click]', fn)
}

function $listDataShowClick(json, item, parant, fn, showType) {

	$listDataClick(json, item, parant, fn)

	$ifelse(showType)
}
/**
 * if-else控制 显示和隐藏(整个dom) 例如: if="pmflag={{pmflag}}" 
 * @param {Object} showType 显示的type值
 */
function $ifelse(showType) {
	var doms = $all('div[if]');
	for (var i = 0, len = doms.length; i < len; i++) {
		var type = doms[i].getAttribute("if")
		var dis = type == showType ? "block" : "none"
		$css(doms[i], 'display', dis);
	}
	var doms = $all('div[else]');
	for (var i = 0, len = doms.length; i < len; i++) {
		var type = doms[i].getAttribute("else")
		var dis = type == showType ? "none" : "block"
		$css(doms[i], 'display', dis);
	}
}
/**
 * if-elseif-else 控制 显示和隐藏(list中多个else)  例如: if="{{type}}=1"
 * @param {Object} doms 含义if-else的数组 例如:  $all(".typetag") 
 */
function $ifElseIf(doms) {
	for (var j = 0, len = doms.length; j < len; j++) {
		var type1 = doms[j].getAttribute("if")
		var type2 = doms[j].getAttribute("elseif")
		var type3 = doms[j].getAttribute("else")
		if (type1 || type2 || type3) {
			var type = (type1 || type2 || type3)
			$css(doms[j], 'display', "none"); //先都隐藏
			/* 必须使用= */
			var strs = type.split("=");
			if (strs[0] == strs[1]) {
				$css(doms[j], 'display', "block");
			}
		}
	}
}

/**
 * @param {Object} id elementId
 * @param {Object} type 类型
 */
function $trigger(id, type) {
	var dom = $id(id);
	$log(dom.dispatchEvent)
	if (dom.dispatchEvent) { // 现代浏览器
		// 创建事件
		var evt = document.createEvent('Event');
		// 事件类型，是否冒泡，是否阻止浏览器的默认行为
		evt.initEvent(type, false, true);
		// 触发事件
		dom.dispatchEvent(evt);
	} else if (dom.fireEvent) { // IE
		dom.fireEvent('on' + type);
	}
}
/** 
 * 动态添加class
 * @param {Object} content  id, class, 类型, 属性, 属性值等
 * @param {Object} name class的名称
 */
function $addClass(content, name) {
	var doms = $all(content);
	if (doms.length) {
		for (var i = 0, len = doms.length; i < len; i++) {
			doms[i].className = doms[i].className + ' ' + name;
		}
	} else {
		doms.className = doms.className + ' ' + name;
	}
}
/**
 * 移除class
 * @param {Object} content id, class, 类型, 属性, 属性值等
 * @param {Object} name class的名称
 */
function $removeClass(content, name) {
	var doms = $all(content);
	if (doms.length) {
		for (var i = 0, len = doms.length; i < len; i++) {
			doms[i].className = doms[i].className.replace(name, '');
		}
	} else {
		doms.className = doms.className.replace(name, '');
	}
}

function $attr(content, key, value) {
	var dom = $all(content);;
	if (dom.length) { // 如果是数组  比如tag
		if (value) {
			for (var i = 0, len = dom.length; i < len; i++) {
				dom[i].setAttribute(key, value);
			}
		} else {
			return dom[0].getAttribute(key);
		}
	} else { // 如果是单个元素  比如id
		if (value) {
			dom.setAttribute(key, value);
		} else {
			return dom.getAttribute(key);
		}
	}
}
/**
 * 显示/隐藏-转换器
 * @param {Object} show 显示-单个或数组[]
 * @param {Object} hide 隐藏-单个或数组[]
 */
function $toggle(show, hide) {
	if ($isArray(show)) { //数组
		for (var i = 0; i < show.length; i++) {
			$show(show[i]);
		}
	} else {
		$show(show);
	}
	if ($isArray(hide)) { //数组
		for (var i = 0; i < hide.length; i++) {
			$hide(hide);
		}
	} else {
		$hide(hide);
	}
}
//显示
function $show(selector) {
	var doms = $all(selector);
	for (var i = 0, len = doms.length; i < len; i++) {
		if (!doms[i]) return //判空
		var val = $css(doms[i], 'display') //先取一下
		var block = 'block'; //默认block
		if (val == 'flex') {
			block = val;
			doms[i].setAttribute("data-dhcdisplay", val); // 设置自定义属性
		}
		if (val == 'none') {
			var disVal = doms[i].getAttribute("data-dhcdisplay");
			if (disVal) block = disVal;
		}
		$css(doms[i], 'display', block);
		$css(doms[i], 'opacity', '1');
	}
}
//隐藏
function $hide(selector) {
	var doms = $all(selector);
	for (var i = 0, len = doms.length; i < len; i++) {
		$css(doms[i], 'display', 'none');
	}
}
function $hideV2(selector) {
	var doms = $all(selector);
	for (var i = 0, len = doms.length; i < len; i++) {
		$css(doms[i], 'display', 'none !important');
		$css(doms[i], 'opacity', '0');
		$css(doms[i], 'z-index', '0');
	}
}
/**
 * 设置/获取样式
 * @param {Object} context 元素或selector
 * @param {Object} key 
 * @param {Object} value
 */
function $css(context, key, value) {
	var dom = $all(context);
	if (dom.length) { // 如果是数组
		if (value) { // 如果value不为空，则表示设置
			for (var i = dom.length - 1; i >= 0; i--) {
				dom[i].style[key] = value;
			}
		} else {
			// 如果value为空，则表示获取
			return _getStyle(dom[0]);
		}
	} else { // 如果不是数组
		if (value) {
			dom.style[key] = value;
		} else {
			return _getStyle(dom);
		}
	}
	/**
	 * 获取样式
	 */
	function _getStyle(dom) {
		if (dom.currentStyle) {
			return dom.currentStyle[key];
		} else {
			//window.getComputedStyle()参数:元素 ;伪类
			return getComputedStyle(dom, null)[key];
		}
	}
}

/**
 * 点击事件
 * @param {Object} id element的Id
 * @param {Object} fn 回调函数
 */
function $click(id, fn) {
	$bind(id, 'tap', fn);
}
/** 
 * 捕获点击事件
 * @param {Object} id element的Id
 * @param {Object} fn 回调函数
 */
function $clickCatch(id, fn) {
	$id(id).addEventListener('tap', function(e) {
		e.stopPropagation();
		if (fn) fn(this) //回调this
		return false
	}, true);
}
/**
 * 指定的点击事件
 * @param {Object} selector selector 选择器 一般为class查询
 * @param {Object} fn fn 回调函数 this.index为下标
 */
function $clickAll(selector, fn) {
	var doms = $all(selector);
	//如果空 默认class查询
	if ((doms.length == 0) && (selector.substr(0, 1) != ".")) {
		var doms = $all("." + selector);
	}
	for (var i = 0, len = doms.length; i < len; i++) {
		doms[i].index = i //添加下标
		$bind(doms[i], 'tap', fn);
	}
}
/**
 * 捕获指定的点击事件
 * @param {Object} selector 选择器 一般为class查询
 * @param {Object} fn  fn 回调函数 参数e
 */
function $clickAllCatch(selector, fn) {
	var doms = $all(selector);
	//如果空 默认class查询
	if ((doms.length == 0) && (selector.substr(0, 1) != ".")) {
		var doms = $all("." + selector);
	}
	for (var i = 0, len = doms.length; i < len; i++) {
		doms[i].index = i //添加下标
		$clickCatch(doms[i], fn);
	}
}
/**
 * 绑定事件
 * @param {Object} id element的Id
 * @param {Object} type 类型
 * @param {Object} fn 回调函数
 */
function $bind(id, type, fn) {
	var dom = $id(id);
	if (dom && dom.addEventListener) {
		//1:type: 点击事件; 拖拽事件; 多媒体事件等等;  2: 回调函数  3:默认值为 false, 即冒泡传递，当值为 true 时, 事件使用捕获传递。
		dom.addEventListener(type, fn, false);
	} else if (dom && dom.attachEvent) { //兼容
		dom.attachEvent('on' + type, fn);
	}
}
/**
 * 取消绑定事件
 * @param {Object} id element的Id
 * @param {Object} type 类型
 * @param {Object} fn 回调函数
 */
function $unbind(id, type, fn) {
	var dom = $id(id);
	if (dom.removeEventListener) {
		dom.removeEventListener(type, fn);
	} else if (dom.detachEvent) {
		dom.detachEvent(type, fn);
	}
}
/**
 * 对象属性拓展
 * @param {Object} tar 目标对象
 * @param {Object} source 原对象
 */
function $extend(tar, source) {
	//遍历对象
	for (var i in source) {
		tar[i] = source[i];
	}
	return tar;
}
/** 
 * 日志输出
 * @param {Object} o String 或 Object
 */
function $log(o) {
	console.log(o);
}
function $plusLog(o) {
	console.log(o);
	if (mui.os.plus) {
	/*调用对象（类对象/实例对象）的方法
	  Object plus.android.invoke( Object obj, String name, Object... args );
	  obj: ( InstanceObject | ClassObject | String ) 必选 调用方法所属的对象，也可以是类的名称
      如果obj为实例对象（InstanceObject），则调用的是实例的方法； 如果obj为类对象（ClassObject），则调用的是类的静态方法； 如果obj为字符串类型，其值必须是类的名称，则调用的是类的静态方法；

      name: ( String ) 必选 要调用的方法名称
      如果指定的方法名称不存在，则调用方法失败，不会抛出异常。

      args: ( Object ) 可选 调用方法的参数
      如果指定的参数数目或类型不区配，则调用方法失败，不会抛出异常。
      */
	  if (window.plus && plus.runtime.appid == "HBuilder") {
		  
	  }else{
		  var main = plus.android.runtimeMainActivity();
		  plus.android.invoke(main, "consoleLog",o)
	  }
	}
}
/**
 * 通过id获取element
 * @param {Object} id element的ID
 */
function $id(id) {
	return $isString(id) ? document.getElementById(id) : id;
}
/**
 * 通过id获取element
 * @param {Object} tag element的Tag
 */
function $tag(tag) {
	return document.getElementsByTagName(tag)
}
/**
 * 获取匹配 CSS 选择器的一个元素
 * @param {Object} selector 支持#id .class tag  tag.class tag[属性]
 */
function $query(selector) {
	return $isString(selector) ? document.querySelector(selector) : selector;
}

function $all(selector) {
	return $isString(selector) ? document.querySelectorAll(selector) : selector;
}
/**
 * 去除空格
 * @param {Object} str 字符串
 */
function $trim(str) {
	return str.replace(/(^\s*)|(\s*$)/g, '');
}
/**
 * 获取随机数
 * @param {Object} begin 开始
 * @param {Object} end 结束
 */
function $random(begin, end) {
	return Math.floor(Math.random() * (end - begin)) + begin;
}
/**
 * 数据类型检查
 * @param {Object} val
 */
function $isNumber(val) {
	return typeof val === 'number' && isFinite(val)
}

function $isBoolean(val) {
	return typeof val === "boolean";
}

function $isString(val) {
	return typeof val === "string";
}

function $isUndefined(val) {
	return typeof val === "undefined";
}

function $isObj(str) {
	if (str === null || typeof str === 'undefined') {
		return false;
	}
	return typeof str === 'object';
}

function $isNull(val) {
	return val === null;
}

function $isArray(arr) {
	if (arr === null || typeof arr === 'undefined') {
		return false;
	}
	return arr.constructor === Array;
}
